package itheima.com.testlistfragmentdemo.base;

import android.app.Fragment;
import android.content.Context;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.annotation.RequiresApi;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.loopj.android.http.AsyncHttpResponseHandler;

import org.apache.http.Header;

import java.util.List;

import itheima.com.testlistfragmentdemo.MyApplication;
import itheima.com.testlistfragmentdemo.R;
import itheima.com.testlistfragmentdemo.net.OSChinaAPI;

import static android.support.v7.widget.RecyclerView.*;

/*1. 展示资讯列表实现步骤分析
        * 初始化界面相关布局
        1. 设置xml布局文件，配置布局文件给界面，加载布局   :公共方法
        SwipeRefreshLayout+RecyclerView
        View.inflate()
        * 初始化界面控件及配置
        2. 查找引用关心的控件、初始化控件                  ：公共方法
        3. 对SwipeRefreshLayout设置下拉刷新监听
        4. 给RecyclerView添加条目点击事件,滚动监听         ：公共方法
        5. 创建数据适配器                                  ：特殊方法
        6. 给RecyclerView设置数据适配器                    ：公共方法

        * 请求数据（网络, 数据库, 缓存, 文件）
        7. 发起网络请求数据                                ：特殊方法
        8. 将请求到的数据解析 xml-->xStream-> Bean转换     : 特殊方法
        List<News>
        9. 展示数据到界面上(更新数据适配器)                ：公共方法
        */

public abstract class BaseListFragment<T> extends Fragment implements SwipeRefreshLayout.OnRefreshListener {
    protected Context context;
    protected   SwipeRefreshLayout mRefreshLayout;
    protected RecyclerView mRecyclerView;
    protected BaseListAdpater mAdapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        context=getActivity();
    }
    @RequiresApi(api = Build.VERSION_CODES.M)
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        //1. 设置xml布局文件，配置布局文件给界面，加载布局
        View view=inflater.inflate(getLayout(),container,false);

        //2. 查找引用关心的控件、初始化控件
        mRefreshLayout= (SwipeRefreshLayout) view.findViewById(R.id.swipe_layout);
        //初始化颜色条
        mRefreshLayout.setColorSchemeColors(
                Color.parseColor("#ff0000"),
                Color.parseColor("#00ff00"),
                Color.parseColor("#0000ff"),
                Color.parseColor("#00ffff")
        );
        mRecyclerView= (RecyclerView) view.findViewById(R.id.rv_news);
        //设置布局方式 ： 线性布局
        LinearLayoutManager layoutManager=new LinearLayoutManager(context);
        layoutManager.setOrientation(LinearLayoutManager.VERTICAL);//设置垂直方向
        mRecyclerView.setLayoutManager(layoutManager);

        //3.对SwipeRefreshLayout设置下拉刷新监听
        mRefreshLayout.setOnRefreshListener(this);
        //4. 给RecyclerView添加条目点击事件,滚动监听
        mRecyclerView.addOnScrollListener(new OnScrollListener() {
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
            }
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
            }
        });

        //5. 取得数据适配器
        mAdapter = getListAdapter();

        //6. 给RecyclerView设置数据适配器
        mRecyclerView.setAdapter(mAdapter);

        return view;
    }


    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        //7.发起网络请求数据
        sendRequestData();
    }

    // 发起请求数据的方法(网络请求)
/*    private void sendRequestData() {
        String urlStr="http://10.0.2.2:8080/oschina/list/news/page0.xml";
        //通过一个工具类实现网络请求
        OSChinaAPI.getData(urlStr,);
    }*/



    //构建一个接口回调对象
    public  OSChinaAPI.ResultListener listener1= new OSChinaAPI.ResultListener(){
        @Override
        public void onSuccess(byte[] datas) {
            //8. 将请求到的数据解析 (InputSteam, byte[], String) -> (Gson,xStream) -> Bean转换
            final List<T> list=parseData(datas);
            //9.展示数据到界面上(更新数据适配器)
            //向主线程队列发一个任务，该任务在主线程处理
            MyApplication.getHandler().post(new Runnable() {
                @Override
                public void run() {
                    //设置list数据（来自网络）给RecyclerView的适配器，再通过适配器来更新界面
                    mAdapter.setList(list);
                }
            });

        }
        @Override
        public void onFailure(String errorInfo) {
        }
    };

    //使用AsyncHttpClient 框架的回调接口对象
    public AsyncHttpResponseHandler listener=new AsyncHttpResponseHandler() {
        @Override
        public void onSuccess(int i, Header[] headers, byte[] datas) {
            //8. 将请求到的数据解析 (InputSteam, byte[], String) -> (Gson,xStream) -> Bean转换
            final List<T> list=parseData(datas);
            //9.展示数据到界面上(更新数据适配器)
            MyApplication.getHandler().post(new Runnable() {
                @Override
                public void run() {
                    mAdapter.setList(list);
                }
            });

        }
        @Override
        public void onFailure(int i, Header[] headers, byte[] data, Throwable throwable) {
        }
    };

    //下拉刷新的监听回调方法，抽象出去，由子类实现
    @Override
    public abstract  void onRefresh();
    //取得片段xml布局的资源id， hook ，钩子方法，在模板设计模式中经常使用
    public int getLayout(){
        return  R.layout.fragment_news_info;
    }
    //取得适配器 ,由于父类不能决定子类的适配器如何实现，所以抽象出去，由子类来实现
    protected abstract BaseListAdpater getListAdapter();
    //发起网络请求，由于父类不能决定子类如何实现网络访问，比如url不确定、返回的数据不同意，所以抽象出去，由子类来实现
    protected  abstract void sendRequestData();
    //通过xstream解析xml数据
    protected abstract  List<T> parseData(byte[] datas) ;

}
